"""
什么是装饰器
- 装饰器其实也是一种闭包，其功能就是在不破坏目标函数原有的代码和功能的前提下，为目标函数增加新功能。
- 装饰器就是创建一个闭包函数，在闭包函数内调用目标函数。可以达到不改动目标函数的同时，增加额外的功能。
- @函数名


"""

print("================================== 装饰器的一般写法(底层原理)")
"""
需求：在不改变sleep方法的前提下，在睡觉的前方、后方各加入一句输出打印

实现逻辑：
定义一个闭包函数，在闭包函数内部：
 · 执行目标函数
 · 并完成功能的添加
"""


def outer(func):
    def inner():
        print("我要睡觉了")
        func()  # 调用目标函数
        print("我起床啦")

    return inner


def sleep():
    import time
    import random
    print("睡眠中...")
    time.sleep(random.randint(1, 5))


# 调用方法时，将sleep()函数作为对象的方式传递过去执行，执行结果赋值给了fn
fn = outer(sleep)
fn()

print("================================== 装饰器的语法糖写法")


def outer(func):
    def inner():
        print("我要睡觉了")
        func()  # 调用目标函数
        print("我起床啦")

    return inner


@outer  # 给sleep()添加一个outer装饰器。相当于执行了 sleep = outer(sleep)
def sleep():
    import time
    import random
    print("睡眠中...")
    time.sleep(random.randint(1, 5))


# 调用sleep()时，由于它被@outer标记，实际是将sleep()函数作为参数传递给outer(func)，最终执行的还是inner()函数，结果又赋值给了sleep
sleep()
